package com.wn.sk.common.jwt;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yellow Docter
 * @date 2022 -09-06
 * @desc
 */
public class Demo01 {

    public static void main(String[] args) {

        //载荷
        Map<String,Object> payload = new HashMap<>();

        payload.put("useId",1001);
        payload.put("name","scott");

        //签名
        //通过证书进行签名
        KeyStoreKeyFactory keyFactory = new KeyStoreKeyFactory(
                new ClassPathResource("jwt.jks"), //加载文件 ()
                "123456".toCharArray()
        );

        //传入别名
        //密钥对
        KeyPair keyPair = keyFactory.getKeyPair("jwt");

        //算法ID  RSA
        //密钥对 (从证书中获取 )
        JWTSigner jwtSigner = JWTSignerUtil.createSigner("RSA", keyPair);

        //创建一个jwt的操作

        //创建一个jwt(token)

        /**
         * payload     荷载信息
         * JWTSigner   jwt的签名算法
         */
        String token = JWTUtil.createToken(payload, jwtSigner);
        System.out.println("token = " + token);
        //验证 token

        // 传入 token,和签名器进行比较

        //后期 我们token 第一次 创建后传给前端

        // 如果你访问我们的请求的时候 需要携带token， 把你携带的token 和服务器的签名进行比较
        // 判断你是否有权限访问

        boolean verify = JWTUtil.verify(token, jwtSigner);
        System.out.println("verify = " + verify);

        //解析token
        JWT jwt = JWTUtil.parseToken(token);
        Object useId = jwt.getPayload("useId");
        System.out.println("useId = " + useId);

        Object name = jwt.getPayload("name");
        System.out.println("name = " + name);

    }

}
